home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-06-22 | 3.9 KB | 203 lines | [TEXT/CWIE] |
- // Better Unmount
- //
- // (C) 1996 Damon Cokenias All Rights Reserved
- // cokenias@mtn-palace.com
- //
-
- #include <A4Stuff.h>
- #include <PLStringFuncs.h>
-
- #define kItemsDialogID 128
- #define kOKButton 1
- #define kLabelItem 2
- #define kListItem 3
-
- #define kStringsID 128
- enum {
- kLabelPluralPrefix = 1,
- kLabelPluralSuffix,
- kLabelSingularPrefix,
- kLabelSingularSuffix
- };
-
- pascal void MyUserItemProc (DialogPtr dlog, short itemNumber);
- pascal Boolean MyFilterProc (DialogPtr dlog, EventRecord* event, short* itemHit);
- OSErr GetVolName (short vRefNum, Str32 name);
-
- OSErr GetVolName (short vRefNum, Str32 name)
- {
- HParamBlockRec pb;
-
- pb.volumeParam.ioNamePtr = name;
- pb.volumeParam.ioVRefNum = vRefNum;
- pb.volumeParam.ioVolIndex = 0;
-
- return PBHGetVInfoSync (&pb);
-
- }
-
- short AddOpenItemsToList (short vRefNum, ListHandle list);
-
- ListHandle gList = nil;
-
- short AddOpenItemsToList (short vRefNum, ListHandle list)
- {
- FCBPBRec pb;
- Str32 name;
- short items = 0;
- Cell cell;
-
- cell.h = 0;
-
- for (pb.ioFCBIndx = 1; ; ++ pb.ioFCBIndx) {
- name [0] = 0;
- pb.ioNamePtr = name;
- pb.ioVRefNum = vRefNum;
- pb.ioRefNum = 0;
-
- if (PBGetFCBInfoSync (&pb))
- break;
-
- cell.v = LAddRow (1, 32767, list);
- LSetCell (&name [1], name [0], cell, list);
- ++items;
- }
-
- return items;
- }
-
- pascal void MyUserItemProc (DialogPtr dlog, short itemNumber)
- {
- Rect bounds;
- short itemType;
- Handle itemHandle;
-
- EnterCodeResource ();
-
- if (itemNumber != kListItem)
- goto Exit;
-
- GetDialogItem (dlog, kListItem, &itemType, &itemHandle, &bounds);
-
- bounds.top -= 1;
- bounds.bottom += 1;
- bounds.left -= 1;
-
- FrameRect (&bounds);
- LUpdate (dlog -> visRgn, gList);
-
- Exit:
- ExitCodeResource ();
- }
-
- pascal Boolean MyFilterProc (DialogPtr dlog, EventRecord* event, short* itemHit)
- {
- Rect bounds;
- short itemType;
- Handle itemHandle;
- Boolean retVal = false;
-
- EnterCodeResource ();
-
- if (event -> what == mouseDown) {
- Point where = event -> where;
- GrafPtr oldPort;
-
- GetPort (&oldPort);
- SetPort (dlog);
-
- GlobalToLocal (&where);
- GetDialogItem (dlog, kListItem, &itemType, &itemHandle, &bounds);
-
- // Restrict clicks to scroll bar
- bounds.left = bounds.right - 16;
-
- if (PtInRect (where, &bounds)) {
- LClick (where, event -> modifiers, gList);
- *itemHit = kListItem;
- retVal = true;
- }
-
- SetPort (oldPort);
- }
-
- Exit:
-
- if (retVal == false)
- retVal = StdFilterProc (dlog, event, itemHit);
-
- ExitCodeResource ();
- return retVal;
- }
-
- pascal void main (short vRefNum)
- {
- DialogPtr dlog = nil;
- short itemHit;
- Str255 prefix, suffix, prompt;
- Str32 name;
- Rect bounds;
- Rect dataBounds;
- Point cSize;
- short itemType;
- Handle itemHandle;
- short numItems;
-
- EnterCodeResource ();
-
- gList = nil;
-
- dlog = GetNewDialog (kItemsDialogID, nil, (WindowPtr) -1);
- if (!dlog)
- goto Exit;
-
- GetDialogItem (dlog, kListItem, &itemType, &itemHandle, &bounds);
- SetDialogItem (dlog, kListItem, itemType, (Handle) MyUserItemProc, &bounds);
-
- bounds.right -= 16;
-
- dataBounds.top = dataBounds.left = 0;
- dataBounds.bottom = 0;
- dataBounds.right = 1;
-
- cSize.h = 0;
- cSize.v = 0;
-
- gList = LNew (&bounds, &dataBounds, cSize, 0, dlog, TRUE, FALSE, FALSE, TRUE);
- if (!gList)
- goto Exit;
-
- numItems = AddOpenItemsToList (vRefNum, gList);
- GetIndString (prefix, kStringsID, (numItems > 1) ? kLabelPluralPrefix : kLabelSingularPrefix);
- GetIndString (suffix, kStringsID, (numItems > 1) ? kLabelPluralSuffix : kLabelSingularSuffix);
-
- if (GetVolName (vRefNum, name))
- name [0] = '\0';
-
- prompt [0] = '\0';
- PLstrcat (prompt, prefix);
- PLstrcat (prompt, name);
- PLstrcat (prompt, suffix);
-
- GetDialogItem (dlog, kLabelItem, &itemType, &itemHandle, &bounds);
- SetDialogItemText (itemHandle, prompt);
-
- SetDialogDefaultItem (dlog, kOKButton);
-
- ShowWindow (dlog);
-
- do {
- ModalDialog (MyFilterProc, &itemHit);
- } while (itemHit != kOKButton);
-
- Exit:
- if (gList)
- LDispose (gList);
-
- if (dlog)
- DisposeDialog (dlog);
-
- ExitCodeResource ();
- }
-
-